package com.jt1078.streamserver.handler;

import com.jt1078.streamserver.manager.JT1078SessionManager;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.channel.*;
import io.netty.util.ReferenceCountUtil;

public class TalkDownHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        ByteBuf buf = (ByteBuf) msg;
        try {
            // 支持6/10字节SIM自动判断（与推流保持一致）
            int simMarkIdx = buf.readerIndex();
            byte[] simBytes6 = new byte[6];
            buf.getBytes(simMarkIdx, simBytes6);
            String sim = bcdToString(simBytes6).replaceFirst("^0+", "");
            buf.skipBytes(6);

            JT1078SessionManager.JT1078Session session = JT1078SessionManager.getSession(sim);
            if (session == null || session.deviceChannel == null) {
                // 尝试10字节
                buf.readerIndex(simMarkIdx);
                byte[] simBytes10 = new byte[10];
                buf.readBytes(simBytes10);
                sim = bcdToString(simBytes10).replaceFirst("^0+", "");
                session = JT1078SessionManager.getSession(sim);
                if (session == null || session.deviceChannel == null) return;
            }

            // 假设剩下全部为G711A音频
            byte[] audio = new byte[buf.readableBytes()];
            buf.readBytes(audio);

            // === JT1078 音频数据包封装 ===
            ByteBuf pkt = encodeJT1078AudioFrame(session, audio);
            // 下发到设备
            session.deviceChannel.writeAndFlush(pkt);
        } finally {
            ReferenceCountUtil.release(buf);
        }
    }

    /**
     * 打包JT1078音频帧（G711A）
     */
    private ByteBuf encodeJT1078AudioFrame(JT1078SessionManager.JT1078Session session, byte[] audio) {
        // 这里以2016国标为例，实际协议细节如需要填协议头/校验请参照JT/T 1078文档
        ByteBuf buf = Unpooled.buffer();

        // 0x30316364固定头，SIM，通道号等按你的推流协议填充
        buf.writeInt(0x30316364); // 帧头 magic
        if (session.simLen == 10) {
            // 10字节
            byte[] simBcd = toBcd(session.sim, 10);
            buf.writeBytes(simBcd);
        } else {
            // 6字节
            byte[] simBcd = toBcd(session.sim, 6);
            buf.writeBytes(simBcd);
        }
        buf.writeByte(1); // 通道号（例：1）
        buf.writeByte(4); // 数据类型: 4=音频
        buf.writeShort(0); // 帧率
        buf.writeInt((int) (System.currentTimeMillis() / 1000)); // 时间戳
        buf.writeShort(0); // 序号
        buf.writeByte(0); // 分包标志
        buf.writeBytes(audio);

        return buf;
    }

    /**
     * 十进制字符串转BCD
     */
    private static byte[] toBcd(String num, int len) {
        // 前补0
        while (num.length() < len * 2) num = "0" + num;
        byte[] ret = new byte[len];
        for (int i = 0; i < len; i++) {
            int high = Character.digit(num.charAt(i * 2), 16);
            int low = Character.digit(num.charAt(i * 2 + 1), 16);
            ret[i] = (byte) ((high << 4) | low);
        }
        return ret;
    }

    private static String bcdToString(byte[] bcd) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bcd) sb.append((b >> 4) & 0xF).append(b & 0xF);
        return sb.toString().replaceFirst("^0+", "");
    }
}
